package com.oa.service.impl;

import com.oa.mapper.DeptMapper;
import com.oa.pojo.Dept;
import com.oa.pojo.Option;
import com.oa.pojo.PageBean;
import com.oa.service.DeptService;
import com.oa.utils.EntityException;
import org.activiti.engine.RuntimeService;
import org.apache.ibatis.annotations.Param;
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutionException;

/**
 * @Author Str
 * @Date 2021/12/6 20:21
 * @Description :
 */
@Service
public class DeptServiceImpl implements DeptService {
    // 用于记录级别
    private int levelNum;

    @Autowired
    private DeptMapper deptMapper;

    @Override
    public PageBean<Dept> getAll(int page, int limit) {
        List<Dept> list = null;
        PageBean<Dept> pBean = new PageBean<>();
        list = deptMapper.getAll();
        //{3}封装数据到分页 Bean
        pBean.setCount(list.size());  //暂时先设置 list 大小
        pBean.setList(list);
        return pBean;
    }

    @Override
    public Dept getOneById(String deptId) {
        return deptMapper.getOneById(deptId);
    }

    @Override
    public int addDept(Dept dept) {
        return deptMapper.addDept(dept);
    }

    @Override
    public int updateDept(Dept dept) {
        return deptMapper.updateDept(dept);
    }

    @Override
    public int delDept(String deptId) throws EntityException {
        // 获取上级部门ID
        String parentId = deptMapper.getOneById(deptId).getParentId();
        // 获取这个上级部门的子部门数
        int deptHasSubNum = deptMapper.getDeptHasSubNum(parentId);
        System.out.println(parentId+"的子部门数:"+deptHasSubNum);
        // 如果这个上级部门只有一个子部门，则修改它的hasSub为0
        if (deptHasSubNum < 2) {
            deptMapper.updateHasSub(parentId, "0");
        }
        // 删除操作
        int i = deptMapper.delDept(deptId);
        if (i != 1) {
            throw new EntityException("删除失败");
        }
        return i;
    }

    @Override
    public String getDeptLeaderID(@Param("deptId") String deptId) {
        return deptMapper.getDeptLeaderID(deptId);
    }

    @Override
    public String getHigherLevelDeptId(@Param("deptId") String deptId) {
        String pids = deptMapper.getPids(deptId);
        // 分割pids
        String[] split = pids.split(",");
        // 获取最后那个部门ID，也就是上一级的部门ID
        return split[split.length - 1];
    }

    @Override      //下拉列表{1}
    public List<Option> getDeptOptions() {
        return deptMapper.queryDeptOptions();
    }

    @Override
    public void saveDept(Map<String, String> map) throws EntityException {
        Dept dept = new Dept();
        dept.setId(map.get("id"));
        dept.setParentId(map.get("parentId"));
        dept.setPids(map.get("pids"));
        dept.setDeptName(map.get("deptName"));
        dept.setDeptDesc(map.get("deptDesc"));
        dept.setHasSub(map.get("hasSub"));
        dept.setLevel(map.get("level"));

        // 创建pids
        String pids = getPids(map.get("parentId"));
        dept.setPids(pids);

        // 生成level
        String level = "lv" + levelNum;
        dept.setLevel(level);
        System.out.println("level:" + level);

        // 默认创建时没有子部门
        dept.setHasSub("0");

        //{ps}这里要同时处理两件事情 [新增 / 更新]
        try {
            //{3}如果 deptID 为空 ----> 新增部门
            if (map.get("id") == null) {
                System.out.println("deptId===========" + map.get("id"));
                //{a}查询是否存在
                Dept find = deptMapper.getOneByDeptName(map.get("deptName"));
                //{b}如果部门存在, 不能新增部门
                if (find != null) {
                    throw new EntityException("部门名已存在。");
                }
                // 创建deptId
                String thisDeptId = getThisDeptId();
                dept.setId(thisDeptId);
                System.out.println("=========thisDeptIdNo:" + thisDeptId + "=========");
                System.out.println("DeptService.dept::" + dept);

                //{c}新增部门
                int addDept = deptMapper.addDept(dept);
                System.out.println("addDept::" + addDept);
//                // 修改上级部门的hasSub
                int updateHasSub = deptMapper.updateHasSub(map.get("parentId"), "1");
                System.out.println("updateHasSub::" + updateHasSub);
                // 回退
                levelNum = 0;
            } else {    //不为空 ---> 更新部门
                // 先获取原来部门的parentId
                String parentId = deptMapper.getOneById(map.get("id")).getParentId();
                // 先判断有没有修改所属部门
                if (!parentId.equals(map.get("parentId"))) {
                    // 获取这个上级部门的子部门数
                    int deptHasSubNum = deptMapper.getDeptHasSubNum(parentId);
                    System.out.println(parentId+"的子部门数:"+deptHasSubNum);
                    // 如果这个上级部门只有一个子部门，则修改它的hasSub为0
                    if (deptHasSubNum < 2) {
                        deptMapper.updateHasSub(parentId, "0");
                    }
                    // 修改本次上级部门的hasSub
                    deptMapper.updateHasSub(map.get("parentId"), "1");
                }
                System.out.println("updateDept:" + dept);
                // 修改部门
                deptMapper.updateDept(dept);
                // 回退
                levelNum = 0;
            }
        } catch (EntityException e) {
            throw new EntityException("保存失败");
        }
    }

    // 生成deptId
    // 样式：d1、d2....
    public String getThisDeptId() {
        // 获取总数
        int count = deptMapper.getCount();
        // 获取最后那条数据的deptId
        String endDeptId = deptMapper.getEndDeptId(count);
        // 分割字符，获取d后面的字符
        String deptIdNo = endDeptId.substring(1, endDeptId.length());
        int i = Integer.parseInt(deptIdNo);
        // 数字+1，和d拼接形成deptId
        return "d" + (i + 1);
    }

    // 生成pids
    public String getPids(String parentId) {
        StringBuffer pids = new StringBuffer(parentId);
        String highDeptId = "";
        // 循环获取上级的deptId
        while (true) {
            // 级别+1
            levelNum++;
            System.out.println("pids============" + pids);
            // 如果上级deptId为top，则退出
            if (highDeptId.equals("top")) {
                break;
            }
            highDeptId = deptMapper.getHighDeptId(parentId);
            System.out.println("highDeptId:" + highDeptId);
            // 插入部门
            pids.insert(0, highDeptId + ",");
            parentId = highDeptId;
        }
        return new String(pids);
    }

    @Override
    public int updateHasSub(String deptId, String hasSub) {
        return 0;
    }
}
